home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / gfx / opal / devdocs.lha / Examples / displaydir.c < prev    next >
C/C++ Source or Header  |  1992-12-16  |  4KB  |  163 lines

  1. #define OPAL_PRIVATE
  2. #include <opal/opallib.h>
  3. #include <proto/all.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <exec/memory.h>
  8.  
  9.  
  10. struct OpalBase *OpalBase;
  11. struct OpalScreen *OScrn;
  12.  
  13. BOOL Display_Directory (char *Path);
  14. char *Make_FileName (char *Path,char *FileName);
  15. long OldOSFlags;
  16. long OldUpdCount;
  17.  
  18. #define AND &&
  19. #define OR ||
  20.  
  21. #define TNWIDTH     48        /* Multiply this by 2 for hires */
  22. #define TNLINES  30        /* Multiply this by 2 for interlace */
  23. #define XSPACING 10        /* Multiply this by 2 for hires */
  24. #define YSPACING 5        /* Multiply this by 2 for interlace */
  25. #define XSTART 20
  26. #define YSTART 6
  27.  
  28. BOOL Display_Directory (char *Path);
  29. char *Make_FileName (char *Path,char *FileName);
  30. void Set_Lores (int Top,int Lines);
  31. void Restore_Res (void);
  32.  
  33.  
  34. void main (int argc,char *argv[])
  35. {
  36.  
  37.     if (argc!=2)
  38.         { puts ("Usage: DisplayDir Directory\n");
  39.           exit (0);
  40.         }
  41.  
  42.     OpalBase = (struct OpalBase *) OpenLibrary ("opal.library",0L);
  43.     if (OpalBase==NULL)
  44.         { puts ("Can't open opal.library\n");
  45.           exit (0);
  46.         }
  47.  
  48.     OScrn = OpenScreen24 (0);
  49.     if (OScrn!=NULL)
  50.         { Display_Directory (argv[1]);
  51.           Refresh24();
  52.           Delay (150L);
  53.           CloseScreen24 ();
  54.         }
  55.     CloseLibrary ((struct Library *)OpalBase);
  56. }
  57.  
  58.  
  59. BOOL Display_Directory (char *Path)
  60. {
  61.    struct FileLock *FL;
  62.    struct FileInfoBlock *FIB;
  63.    register int x,y;
  64.    long Error;
  65.    BOOL Aborted;
  66.    char *Name;
  67.  
  68.  
  69.     FIB = AllocMem ((long)sizeof(struct FileInfoBlock),MEMF_CLEAR);
  70.     if (FIB==NULL)
  71.         return (FALSE);
  72.  
  73.     FL = (struct FileLock *) Lock (Path,ACCESS_READ);
  74.     if (FL==NULL)
  75.         { printf ("Couldn't open Directory !!");
  76.           FreeMem (FIB,(long)sizeof(struct FileInfoBlock));
  77.           return (FALSE);
  78.         }
  79.  
  80.     x = XSTART;
  81.     y = YSTART;
  82.     Aborted = FALSE;
  83.     Examine ((BPTR)FL,FIB);
  84.     Error = 0;
  85.     if (ExNext ((BPTR)FL,FIB)==NULL)
  86.         Error = IoErr();
  87.     while ((Error!=ERROR_NO_MORE_ENTRIES) AND (!Aborted))
  88.         { Name = Make_FileName (Path,FIB->fib_FileName);
  89.           if (DisplayThumbnail24 (OScrn,Name,x,y)==0)
  90.             { x = x + TNWIDTH + XSPACING;
  91.               if (x+TNWIDTH>OScrn->Width)
  92.                 { x = XSTART;
  93.                   y = y + TNLINES+YSPACING;
  94.                   if (y+TNLINES>OScrn->Height) Aborted = TRUE;
  95.                 }
  96.             }
  97.           if (ExNext ((BPTR)FL,FIB)==NULL)
  98.             Error = IoErr();
  99.           }
  100.  
  101.     UnLock ((BPTR)FL);
  102.     FreeMem (FIB,(long)sizeof(struct FileInfoBlock));
  103.     return (TRUE);
  104. }
  105.  
  106. char TempStr[200];
  107.  
  108. char *Make_FileName (char *Path,char *FileName)
  109. {
  110.    register int i;
  111.  
  112.     strcpy (TempStr,Path);
  113.     i = strlen (TempStr);
  114.     if ((i!=0) AND (TempStr[i-1]!=':'))
  115.         strcat (TempStr,"/");
  116.     strcat (TempStr,FileName);
  117.     return (TempStr);
  118. }
  119.  
  120.  
  121. /*  The following routines are useful for displaying
  122.  * thumbnails in hires/interlaces screens. Thumbnails
  123.  * are always lores non-interlace, so to get around this
  124.  * the following routine sets a number of lines into lo-res
  125.  * mode, and clears the field bit in the control line of the
  126.  * odd NODMA copper list. This forces both fields to display
  127.  * the same lines. The thumbnails will then be displayed 
  128.  * correctly.
  129.  */
  130.  
  131. void Set_Lores (int Top,int Lines)
  132. {
  133.   register int i;
  134.  
  135.     OldOSFlags = OScrn->Flags;
  136.     OldUpdCount = OScrn->Update_Cycles;
  137.  
  138.     OScrn->Flags &= ~(HIRES24|ILACE24);
  139.     OScrn->Update_Cycles = 3;
  140.     if (OldOSFlags & HIRES24)
  141.         { for (i=Top; (i<Top+Lines) AND (i<OScrn->LastCoProIns); i++)
  142.             OScrn->CoProData[i+OScrn->CoProOffset] &= (~HIRESDISP);
  143.           UpdateCoPro24();
  144.         }
  145.     if (OldOSFlags & ILACE24)
  146.         SetControlBit24 (13L,11L,0L);      /* Display field 0 */
  147. }
  148.  
  149. void Restore_Res (void)
  150. {
  151.    register int i;
  152.  
  153.     OScrn->Flags = OldOSFlags;
  154.     OScrn->Update_Cycles = OldUpdCount;
  155.     if (OldOSFlags & HIRES24)
  156.         { for (i=0; i<OScrn->LastCoProIns; i++)
  157.             OScrn->CoProData[i+OScrn->CoProOffset] |= HIRESDISP;
  158.           UpdateCoPro24();
  159.         }
  160.     if (OldOSFlags & ILACE24)
  161.         SetControlBit24 (13L,11L,1L);    /* Restore field 1 display */
  162. }
  163.